{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## neg_log_loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "import matplotlib.pyplot as plt\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "train=pd.read_csv(\"Tfidf_pima-indians-diabetes.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants_tfidf</th>\n",
       "      <th>Plasma_glucose_concentration_tfidf</th>\n",
       "      <th>blood_pressure_tfidf</th>\n",
       "      <th>Triceps_skin_fold_thickness_tfidf</th>\n",
       "      <th>serum_insulin_tfidf</th>\n",
       "      <th>BMI_tfidf</th>\n",
       "      <th>Diabetes_pedigree_function_tfidf</th>\n",
       "      <th>Age_tfidf</th>\n",
       "      <th>Target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.037717</td>\n",
       "      <td>0.810132</td>\n",
       "      <td>0.409804</td>\n",
       "      <td>0.256931</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.185363</td>\n",
       "      <td>0.003410</td>\n",
       "      <td>0.271919</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.009341</td>\n",
       "      <td>0.691357</td>\n",
       "      <td>0.558183</td>\n",
       "      <td>0.316326</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.218049</td>\n",
       "      <td>0.002836</td>\n",
       "      <td>0.250508</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.046188</td>\n",
       "      <td>0.920021</td>\n",
       "      <td>0.334562</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.118057</td>\n",
       "      <td>0.003357</td>\n",
       "      <td>0.159835</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.005813</td>\n",
       "      <td>0.450469</td>\n",
       "      <td>0.347351</td>\n",
       "      <td>0.156119</td>\n",
       "      <td>0.787603</td>\n",
       "      <td>0.143341</td>\n",
       "      <td>0.000840</td>\n",
       "      <td>0.105602</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.426849</td>\n",
       "      <td>0.129587</td>\n",
       "      <td>0.146243</td>\n",
       "      <td>0.866498</td>\n",
       "      <td>0.135338</td>\n",
       "      <td>0.007082</td>\n",
       "      <td>0.102151</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pregnants_tfidf  Plasma_glucose_concentration_tfidf  blood_pressure_tfidf  \\\n",
       "0         0.037717                            0.810132              0.409804   \n",
       "1         0.009341                            0.691357              0.558183   \n",
       "2         0.046188                            0.920021              0.334562   \n",
       "3         0.005813                            0.450469              0.347351   \n",
       "4         0.000000                            0.426849              0.129587   \n",
       "\n",
       "   Triceps_skin_fold_thickness_tfidf  serum_insulin_tfidf  BMI_tfidf  \\\n",
       "0                           0.256931             0.000000   0.185363   \n",
       "1                           0.316326             0.000000   0.218049   \n",
       "2                           0.000000             0.000000   0.118057   \n",
       "3                           0.156119             0.787603   0.143341   \n",
       "4                           0.146243             0.866498   0.135338   \n",
       "\n",
       "   Diabetes_pedigree_function_tfidf  Age_tfidf  Target  \n",
       "0                          0.003410   0.271919       1  \n",
       "1                          0.002836   0.250508       0  \n",
       "2                          0.003357   0.159835       1  \n",
       "3                          0.000840   0.105602       0  \n",
       "4                          0.007082   0.102151       1  "
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train=train['Target']\n",
    "X_train=train.drop('Target',axis=1)\n",
    "# 保存特征名字以备后用\n",
    "feat_names=X_train.columns\n",
    "# 查看一个学习器是否支持稀疏数据，可以看fit函数是否支持：x{array-like,sparse matric}\\\n",
    "# 可自行用timeit比较稠密数据和稀疏数据的训练时间\n",
    "from scipy.sparse import csr_matrix\n",
    "X_train=csr_matrix(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "lr=LogisticRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each hold is[0.62676485 0.61320098 0.62149925 0.61869585 0.62970065]\n",
      "cv logloss is:0.6219723149455827\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "E:\\Anaconda\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "E:\\Anaconda\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "E:\\Anaconda\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "E:\\Anaconda\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "E:\\Anaconda\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 交叉验证用于评估模型性能和进行参数调优（模型选择）\n",
    "# 分类任务重交叉验证缺省是采用stratifiedkKFold\n",
    "# 数据集比较大，采用5折交叉验证\n",
    "from sklearn.model_selection import cross_val_score\n",
    "loss = cross_val_score(lr,X_train,y_train,cv=5,scoring='neg_log_loss')\n",
    "print (\"logloss of each hold is{0}\".format(-loss ))\n",
    "print (\"cv logloss is:{0}\".format(-loss.mean()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise-deprecating',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='warn',\n",
       "          n_jobs=None, penalty='l2', random_state=None, solver='liblinear',\n",
       "          tol=0.0001, verbose=0, warm_start=False),\n",
       "       fit_params=None, iid='warn', n_jobs=-1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "pealtys=['l1','l2']\n",
    "Cs=[0.1,1 ,10,100,1000]\n",
    "tuned_parameters=dict(penalty=pealtys,C=Cs)\n",
    "lr_penalty=LogisticRegression(solver='liblinear')\n",
    "grid=GridSearchCV(lr_penalty,tuned_parameters,cv=5,scoring='neg_log_loss',n_jobs=-1)\n",
    "grid.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6147368708653304\n",
      "{'C': 10, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "E:\\Anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "E:\\Anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    }
   ],
   "source": [
    "#plot cv曲线\n",
    "test_means=grid.cv_results_['mean_test_score']\n",
    "test_stds=grid.cv_results_['std_test_score']\n",
    "train_means=grid.cv_results_['mean_train_score']\n",
    "train_stds=grid.cv_results_['std_train_score']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.63559327 0.63510216]\n",
      " [0.62143053 0.62196652]\n",
      " [0.61473687 0.61778493]\n",
      " [0.61772672 0.61510992]\n",
      " [0.61775437 0.61560634]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#plot results\n",
    "n_Cs=len(Cs)\n",
    "number_penaltys=len(pealtys)\n",
    "test_score=np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_score=np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds=np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds=np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "x_axis=np.log(Cs)\n",
    "print(-test_score)\n",
    "for i , value in enumerate(pealtys):\n",
    "    plt.errorbar(x_axis,-test_score[:,i],yerr=test_stds[:,i],label=pealtys[i]+'Test')\n",
    "    plt.errorbar(x_axis,-train_score[:,i],yerr=train_stds[:,i],label=pealtys[i]+'Train')\n",
    "plt.legend()\n",
    "plt.xlabel('log(c)')\n",
    "plt.ylabel('logloss')\n",
    "plt.title('Tfidf')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
